using System;
using System.Collections.Generic;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using FEL.ACT;
using Koala.KoalaWebControls;

public partial class ACT_ACT_CLASE : PaginaBaseTreeGrid
{
    protected override Type TipoObjeto
    {
        get { return typeof(Act_Clase); }
    }

    protected override TreeView Trv
    {
        get { return trvActClase; }
    }

    protected override FormView Frv
    {
        get { return frvActCampos; }
    }

    protected override ObjectDataSource OdsFrv
    {
        get { return odsFrvActClase; }
    }

    protected override Button ResponderZoom
    {
        get { return Seleccionar ; }
    }

    protected override Button RegresoZoom
    {
        get { return Atras; }
    }

    protected override KFiltro Filtro
    {
        get { return null; }
    }

    protected override string Contenedor
    {
        get { return "ACT_CLASE"; }
    }

    //int i;

    private int _i
    {
        get
        {
            object o = ViewState["indice"];
            return (o == null) ? 0 : (int)o;

        }
        set
        {
            ViewState["indice"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ActualizarDatos();
            string ClaseId = Request.QueryString.Get("Act_Clase_Id");
            if (ClaseId != null)
            {
                frvActCampos.DefaultMode = FormViewMode.ReadOnly;
                AsignarParametrosDataSourceDeatailsView(ClaseId);                
            }
            else{                
                BloquearFrv();
            }
        }

        odsFrvActClase.Inserted += new ObjectDataSourceStatusEventHandler(odsFrvActClase_Inserted);
        odsFrvActClase.Deleted += new ObjectDataSourceStatusEventHandler(odsFrvActClase_Deleted);
        odsFrvActClase.Updated += new ObjectDataSourceStatusEventHandler(odsFrvActClase_Updated);

        frvActCampos.DataBound += new EventHandler(frvActCampos_DataBound);
        frvActCampos.ModeChanging += new FormViewModeEventHandler(frvActCampos_ModeChanging);
        trvActClase.SelectedNodeChanged += new EventHandler(trvActClase_SelectedNodeChanged);
        
        

        base.Page_Load(sender, e);
        AtributoButton.Click += new EventHandler(AtributoButton_Click);

    }


    void AtributoButton_Click(object sender, EventArgs e)
    {
        string idClase = ((TextBox)Frv.FindControl("Id")).Text;
        string codigoClase = ((TextBox)Frv.FindControl("Codigo")).Text;
        string nombreClase = ((TextBox)Frv.FindControl("Nombre")).Text;

        Response.Redirect("~/ACT/ACT_CLASE_ATRIBUTO.aspx" +
            "?Act_Clase_Id=" + idClase +
            "&Act_Clase_codigo=" + codigoClase +
            "&Act_clase_Nombre=" + nombreClase);

    }

   

    void BloquearFrv()
    {
        Frv.Enabled = false;
    }
    
    void frvActCampos_DataBound (object sender, EventArgs e)
    {
        AtributoButton.Enabled = true;
        if( frvActCampos.CurrentMode == FormViewMode.ReadOnly )
        {
            if (frvActCampos.DataKey["Act_Clase_Id"] == null)
            {
                DeshabilitarBoton("DeleteButton");
                AtributoButton.Enabled = false;
            }
        }

        if (frvActCampos.CurrentMode == FormViewMode.Insert)
        {            
            AtributoButton.Enabled = false;
        }

        if (_i < 2)
        {
            if (Frv.CurrentMode == FormViewMode.ReadOnly)
            {
                HabilitarBoton1("NewButton");
            }
        }

        if (_i >= 2)
        {
            if (Frv.CurrentMode == FormViewMode.ReadOnly)
            {
                DeshabilitarBoton1("NewButton");
            }
        }          
    }

    void HabilitarBoton1(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = true;
    }

    void DeshabilitarBoton1(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = false;
    }

    void DeshabilitarBoton(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = false;
    }

    void habilitarBoton(string idBoton)
    {
        Control boton = Frv.FindControl(idBoton);
        ((Button)boton).Enabled = true;
    }

    void odsFrvActClase_Updated(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if( e.Exception == null )
        {
            string valuePath = null;
            if (ViewState["trvActClaseValuePath"] != null)
                valuePath = ViewState["trvActClaseValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                ActualizarDatos();
                
                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvActClase, valuePath, true);
                }
            }
            ViewState["trvActClaseValuePath"] = trvActClase.SelectedNode.ValuePath;
            udpTrv.Update();
        }
    }

    void odsFrvActClase_Deleted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if (e.Exception == null)
        {
            string valuePath = null;
            if (ViewState["trvActClaseValuePath"] != null)
                valuePath = ViewState["trvActClaseValuePath"].ToString();
            if (!string.IsNullOrEmpty(valuePath))
            {
                //int i = ;
                valuePath = valuePath.Remove(valuePath.LastIndexOf(trvActClase.PathSeparator));
                ActualizarDatos();
                if (!string.IsNullOrEmpty(valuePath))
                {
                    ExpandirPath(trvActClase, valuePath, false);
                }

            }
            
            ViewState["trvActClaseValuePath"] = null;
            BloquearFrv();
            //udpTrv.Update();
        }
    }

    void trvActClase_SelectedNodeChanged(object sender, EventArgs e)
    {
        ViewState["trvActClaseValuePath"] = trvActClase.SelectedNode.ValuePath;
        Frv.Enabled = true;

        _i = trvActClase.SelectedNode.Depth;


        
    }

    void frvActCampos_ModeChanging(object sender, FormViewModeEventArgs e)
    {
        if(frvActCampos.CurrentMode == FormViewMode.ReadOnly &&
            e.NewMode == FormViewMode.Insert)
        {
            _id = ObtenerText("Id");
            _codigo = ObtenerText("Codigo");
            _nombre = ObtenerText("Nombre");
        }
    }

    private string _id = string.Empty;
    private string _nombre = string.Empty;
    private string _codigo = string.Empty;

    protected override void DefinirParametrosFijosDeInsercion(List<DictionaryEntry> param)
    {
        if (!string.IsNullOrEmpty(_id))
        {
            param.Add(new DictionaryEntry("Act_Clase_Id", _id));            
            param.Add(new DictionaryEntry("Act_Clase_Codigo", _codigo));
            param.Add(new DictionaryEntry("Act_Clase_Nombre", _nombre));
        }
    }


    string ObtenerText(string idTextBox)
    {
        return ((TextBox) Frv.FindControl(idTextBox)).Text;
    }

    

    void odsFrvActClase_Inserted(object sender, ObjectDataSourceStatusEventArgs e)
    {
        if(e.Exception == null)
        {
            string valuePath = null;
            if(ViewState["trvActClaseValuePath"] != null)
                valuePath = ViewState["trvActClaseValuePath"].ToString();

            ActualizarDatos();

            string nuevoNodo = e.ReturnValue.ToString();

            if (valuePath != null)
                ExpandirPath(trvActClase, valuePath + trvActClase.PathSeparator + nuevoNodo, true);

            _i = trvActClase.SelectedNode.Depth;

            ViewState["trvActClaseValuePath"] = trvActClase.SelectedNode.ValuePath;
        }
    }

    void ActualizarDatos()
    {
        trvActClase.Nodes.Clear();
        List<Act_Clase> lstMetaLista = ObtenerMetadatosArbol((Scope)Session["Scope"]);
        ArmarArbol(trvActClase.Nodes, lstMetaLista, null);
    }

    

    void ExpandirPath(TreeNodeCollection raiz, string valuePath, string nuevoNodoId)
    {
        string nuevoPath = null;
        if (string.IsNullOrEmpty(nuevoNodoId))
            nuevoPath = valuePath;
        else
            nuevoPath = valuePath + trvActClase.PathSeparator + nuevoNodoId;
        
        TreeNode nuevoNodo = trvActClase.FindNode(nuevoPath);
        nuevoNodo.Select();

        while(nuevoNodo.Parent != null)
        {
            nuevoNodo = nuevoNodo.Parent;
            nuevoNodo.Expand();
        }
    }

    void ExpandirPath(TreeView trv, string valuePath, bool selecionarUltimoNodo)
    {
        TreeNode nodo = trv.FindNode(valuePath);
        if (selecionarUltimoNodo)
            nodo.Select();
        while (nodo != null)
        {
            nodo.Expand();
            nodo = nodo.Parent;
        }
    }
    
    TreeNode BuscarNodo (TreeNodeCollection nodos, string indiceNodo)
    {
        for (int i = 0; i < nodos.Count; i++)
        {
            if (nodos[i].Value == indiceNodo)
                return nodos[i];
        }
        return null;
    }


    

    
    private  List<Act_Clase> ObtenerMetadatosArbol(Scope s)
    {
        BO_Act_Clase boActClase = new BO_Act_Clase();

        List<Act_Clase> lstActClase = null;
        try
        {
            lstActClase = boActClase.Get("Nombre", (Scope) Session["Scope"]);
        }
        catch
        {

        }
        return lstActClase;
    }

    private void ArmarArbol (TreeNodeCollection raiz, List<Act_Clase> lstArbolMetaDatos, string IdPadre)
    {
        List<Act_Clase> nuevosNodos = SacarHijos(IdPadre, lstArbolMetaDatos);
        for ( int indiceNuevo = 0; indiceNuevo < nuevosNodos.Count; indiceNuevo++ )
        {
            TreeNode nuevoNodo = AgregarNodo(nuevosNodos[indiceNuevo], raiz);
            ArmarArbol(nuevoNodo.ChildNodes, lstArbolMetaDatos, nuevosNodos[indiceNuevo].Id);
        }  
    }

    private TreeNode AgregarNodo (Act_Clase metaNodoHijo, TreeNodeCollection raizNodo)
    {
        TreeNode nodoHijo = new TreeNode(metaNodoHijo.Nombre, metaNodoHijo.Id);
        nodoHijo.SelectAction = TreeNodeSelectAction.Select;
        nodoHijo.PopulateOnDemand = false;
        raizNodo.Add(nodoHijo);
        return nodoHijo;
    }

    private List<Act_Clase> SacarHijos (string padreId, List<Act_Clase> lstMetadatos)
    {
        List<Act_Clase> lstHijosObtenidos = new List<Act_Clase>();
        for (int indice = 0; indice < lstMetadatos.Count; indice++)
        {
            if (lstMetadatos[indice].Act_Clase_Id == padreId)
            {
                lstHijosObtenidos.Add(lstMetadatos[indice]);
                lstMetadatos.RemoveAt(indice);
                indice--;
            }
        }
        return lstHijosObtenidos;
    }
    
    protected void Val_Inversion_Id_DataBound(object sender, EventArgs e)
    {
        DropDownList ddlInvercion = (DropDownList)sender;
        ddlInvercion.Items.Insert(0, new ListItem("Ninguno", ""));

        ddlInvercion.Attributes.Add("onchange", "checkSelectedValueInvercion()");
        
        TextBox txtVal_Inversion_Id = (TextBox)Frv.FindControl("Val_Inversion_Id");
        ddlInvercion.SelectedValue = txtVal_Inversion_Id.Text;
    }
    
    protected void Act_Grupo_Id_DataBound(object sender, EventArgs e)
    {
        DropDownList ddlGrupo = (DropDownList)sender;
        ddlGrupo.Items.Insert(0, new ListItem("Ninguno", ""));

        ddlGrupo.Attributes.Add("onchange", "checkSelectedValue()");

        TextBox txtVal_Grupo_Id = (TextBox)Frv.FindControl("Act_Grupo_Id");
        ddlGrupo.SelectedValue = txtVal_Grupo_Id.Text;
    }
  
    
}
